<?php
namespace Home\Controller;
use Think\Controller;

class AlipayController extends Controller{
		protected $tb_pay = 'payment' ;//支付方式表
		protected $tb_order = 'order' ;//订单表
		 /**
		 * 引入支付宝
		 *在类初始化方法中，引入相关类库
		*/  
       public function _initialize() {
			header("Content-type:text/html;charset=utf-8");
			vendor('Alipay.Corefunction');
			vendor('Alipay.Md5function');
			vendor('Alipay.Notify');
			vendor('Alipay.Submit');    
       }
	   
		/*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
        *  然后进行相关处理
        */	   
	   public function doalipay($pay_money, $paymoney, $order_list) {
		   
			unset($out_trade_no);
			unset($total_fee);
			unset($body);
			/* *
			 * 功能：即时到账交易接口接入页
			 * 版本：3.4
			 * 修改日期：2016-03*08
			 * 说明：
			 *
			/**************************请求参数**************************/
					//商户订单号，商户网站订单系统中唯一订单号，必填
					$out_trade_no = $order_list['order_sn'];//$_POST['WIDout_trade_no']

					//订单名称，必填
					$subject = "支付订单号：".$order_list['order_sn'];//$_POST['WIDsubject']

					//付款金额，必填
					$total_fee = $pay_money;//$_POST['WIDtotal_fee']

					//商品描述，可空
					$body = "支付订单号：".$order_list['order_sn'];//$_POST['WIDbody']

			/************************************************************/
			//dump($total_fee);die;
			//支付宝账号
			unset($str);
			unset($arr);
			$str = "payment_code='%s'";
			$arr = array('alipay');					
			//查询
			$pay = _getOne($this->tb_pay,$str,$arr);
			$paycode = unserialize($pay['payment_config']) ;			
			//构造要请求的参数数组，无需改动
			$parameter = array(
					"service"       => C('alipay_config.service'),
					"partner"       => $paycode['alipay_partner'],//合作身份者ID，签约账号
					"seller_id"     => $paycode['alipay_partner'],
					"payment_type"	=> C('alipay_config.payment_type'),
					"notify_url"	=> C('alipay_config.notify_url'),
					"return_url"	=> C('alipay_config.return_url'),
					
					"anti_phishing_key"=>C('alipay_config.anti_phishing_key'),
					"exter_invoke_ip"=> get_client_ip(),//客户端的IP地址
					"out_trade_no"	=> $out_trade_no,
					"subject"	=> $subject,
					"total_fee"	=> $total_fee,
					"body"	=> $body,
					"_input_charset"	=> trim(strtolower(C('alipay_config.input_charset'))),					
			);
			
			$alipay_config['partner']		= $paycode['alipay_partner'];
			$alipay_config['seller_id']	= $alipay_config['partner'];
			$alipay_config['key']			= $paycode['alipay_account'];
			$alipay_config['notify_url'] = C('alipay_config.notify_url');
			$alipay_config['return_url'] =  C('alipay_config.return_url');
			$alipay_config['sign_type']  = C('alipay_config.sign_type');
			$alipay_config['input_charset']= C('alipay_config.input_charset');
			$alipay_config['cacert']    = C('alipay_config.cacert');
			$alipay_config['transport']    = C('alipay_config.transport');
			$alipay_config['payment_type'] = C('alipay_config.payment_type');
			$alipay_config['service'] = C('alipay_config.service');
			$alipay_config['anti_phishing_key'] = C('alipay_config.anti_phishing_key');
			$alipay_config['exter_invoke_ip'] = get_client_ip();
			
			//建立请求
			$alipaySubmit =  new \AlipaySubmit($alipay_config);
			$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
			if ($html_text && $paymoney) {
				//站内支付金额
				session('paymoney_www',$paymoney);
				session('paymoney_online',$pay_money);
					
			}
			session('order_list_onlie',$order_list);//订单信息
			echo $html_text;		 
	   }
	   
	  /*
	  *服务器异步通知页面方法       
	  *其实这里就是将notify_url.php文件中的代码复制过来进行处理
	  *
	  */
	  public function notifyurl(){
		 

		//计算得出通知验证结果
			unset($str);
			unset($arr);
			$str = "payment_code='%s'";
			$arr = array('alipay');					
			//查询
			$pay = _getOne($this->tb_pay,$str,$arr);
			$paycode = unserialize($pay['payment_config']) ;
			
			$alipay_config['partner']		= $paycode['alipay_partner'];
			$alipay_config['seller_id']	= $alipay_config['partner'];
			$alipay_config['key']			= $paycode['alipay_account'];
			$alipay_config['notify_url'] = C('alipay_config.notify_url');
			$alipay_config['return_url'] =  C('alipay_config.return_url');
			$alipay_config['sign_type']  = C('alipay_config.sign_type');
			$alipay_config['input_charset']= C('alipay_config.input_charset');
			$alipay_config['cacert']    = C('alipay_config.cacert');
			$alipay_config['transport']    = C('alipay_config.transport');
			$alipay_config['payment_type'] = C('alipay_config.payment_type');
			$alipay_config['service'] = C('alipay_config.service');
			$alipay_config['anti_phishing_key'] = C('alipay_config.anti_phishing_key');
			$alipay_config['exter_invoke_ip'] = get_client_ip();
			
			//计算得出通知验证结果
			$alipayNotify = new \AlipayNotify($alipay_config);
			$verify_result = $alipayNotify->verifyNotify();
			if($verify_result) {
			   //验证成功
			   //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
				$out_trade_no = $_POST['out_trade_no'];//支付宝交易号
				$trade_no = $_POST['trade_no'];//交易状态
				$trade_status = $_POST['trade_status'];
			    $total_fee      = $_POST['total_fee'];         //交易金额
			    $notify_id      = $_POST['notify_id'];         //通知校验ID。
			    $notify_time    = $_POST['notify_time'];        //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
			    $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号；

				$parameter = array(
				 "out_trade_no"     => $out_trade_no, //商户订单编号；
				 "trade_no"     => $trade_no,     //支付宝交易号；
				 "total_fee"     => $total_fee,    //交易金额；
				 "trade_status"     => $trade_status, //交易状态
				 "notify_id"     => $notify_id,    //通知校验ID。
				 "notify_time"   => $notify_time,  //通知的发送时间。
				 "buyer_email"   => $buyer_email,  //买家支付宝帐号；
			   );
			   if($_POST['trade_status'] == 'TRADE_FINISHED') {
					//进行订单处理，并传送从支付宝返回的参数；
					orderhandle($this->tb_order, $parameter, intval($_SESSION['res_pay'])); 
					echo "success";        //请不要修改或删除
			   }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {    
						//进行订单处理，并传送从支付宝返回的参数；
						orderhandle($this->tb_order, $parameter, intval($_SESSION['res_pay'])); 
						echo "success";        //请不要修改或删除	
				}
				echo "success";        //请不要修改或删除
			 }else {
					//验证失败
					echo "fail";
			}  		  
	   }
	  
		/*
        页面跳转处理方法；
        这里其实就是将return_url.php这个文件中的代码复制过来，进行处理； 
        */
		public function returnurl(){
				 //dump($_GET);die;
				//头部的处理跟上面两个方法一样，这里不罗嗦了！
				unset($str);
				unset($arr);
				$str = "payment_code='%s'";
				$arr = array('alipay');					
				//查询
				$pay = _getOne($this->tb_pay,$str,$arr);
				$paycode = unserialize($pay['payment_config']) ;
			
				$alipay_config['partner']		= $paycode['alipay_partner'];
				$alipay_config['seller_id']	= $alipay_config['partner'];
				$alipay_config['key']			= $paycode['alipay_account'];
				$alipay_config['notify_url'] = C('alipay_config.notify_url');
				$alipay_config['return_url'] =  C('alipay_config.return_url');
				$alipay_config['sign_type']  = C('alipay_config.sign_type');
				$alipay_config['input_charset']= C('alipay_config.input_charset');
				$alipay_config['cacert']    = C('alipay_config.cacert');
				$alipay_config['transport']    = C('alipay_config.transport');
				$alipay_config['payment_type'] = C('alipay_config.payment_type');
				$alipay_config['service'] = C('alipay_config.service');
				$alipay_config['anti_phishing_key'] = C('alipay_config.anti_phishing_key');
				$alipay_config['exter_invoke_ip'] = get_client_ip();
				
				$alipayNotify = new \AlipayNotify($alipay_config);//计算得出通知验证结果
				$verify_result = $alipayNotify->verifyReturn();
				if($verify_result) {
					//验证成功
					//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
				$out_trade_no   = $_GET['out_trade_no'];      //商户订单号
				$trade_no       = $_GET['trade_no'];          //支付宝交易号
				$trade_status   = $_GET['trade_status'];      //交易状态
				$total_fee      = $_GET['total_fee'];         //交易金额
				$notify_id      = $_GET['notify_id'];         //通知校验ID。
				$notify_time    = $_GET['notify_time'];       //通知的发送时间。
				$buyer_email    = $_GET['buyer_email'];       //买家支付宝帐号；
					 
				$parameter = array(
					"out_trade_no"     => $out_trade_no,      //商户订单编号；
					"trade_no"     => $trade_no,          //支付宝交易号；
					"total_fee"      => $total_fee,         //交易金额；
					"trade_status"     => $trade_status,      //交易状态
					"notify_id"      => $notify_id,         //通知校验ID。
					"notify_time"    => $notify_time,       //通知的发送时间。
					"buyer_email"    => $buyer_email,       //买家支付宝帐号
				);
				//dump($out_trade_no);die;	 
				if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
					
					//进行订单处理，并传送从支付宝返回的参数；
					orderhandle($this->tb_order, $parameter, intval($_SESSION['res_pay'])); 
					$this->error('支付成功！','/member/swjydd') ;
					
					//die('<script>alert("支付成功！");history.back(-1);</script>') ;
					//跳转到配置项中配置的支付成功页面；
				}else {
					echo "trade_status=".$_GET['trade_status'];
					//die('<script>alert("支付失败！");history.back(-1);</script>') ;
					$this->error('支付失败！','/member/swjydd') ;//跳转到配置项中配置的支付失败页面；
				}
			}else {
				//验证失败
				//如要调试，请看alipay_notify.php页面的verifyReturn函数
				//echo "支付失败！";
				$this->error('支付失败！','/member/swjydd') ;
			}
		}
		

}
